package mx.frantor.catalogos.bussines;

import java.util.Date;
import java.util.List;

import flex.messaging.io.ArrayCollection;
import mx.frantor.catalogos.dao.OrdenDeProduccionDAO;
import mx.frantor.catalogos.dao.PedidosDAO;
import mx.frantor.catalogos.daoimp.OrdenDeProduccionDAOImpl;
import mx.frantor.catalogos.daoimp.PedidosDAOImpl;
import mx.frantor.catalogos.entitys.ClientesEntity;
import mx.frantor.catalogos.entitys.OrdenDeProduccionEntity;
import mx.frantor.catalogos.entitys.DetallePedidoEntity;
import mx.frantor.catalogos.entitys.PedidosEntity;
import mx.frantor.catalogos.bussines.ProductosExistenciaBussines;
import mx.frantor.catalogos.entitys.ProductosExistenciasEntity;
import mx.frantor.catalogos.entitys.CatalogoProductoEntity;
import mx.frantor.catalogos.bussines.CatalogoProductoBussines;
import mx.frantor.catalogos.bussines.MateriaPrimaExistenciasBussines;
import mx.frantor.catalogos.entitys.MateriaPrimaExistenciasEntity;
import mx.frantor.util.DateUtil;

public class OrdenDeProduccionBussines {
	private OrdenDeProduccionDAO ordProdDAO = new OrdenDeProduccionDAOImpl();
	private PedidosDAO pedidoDAO = new PedidosDAOImpl();
	private DetallePedidoBussines detPedidoBuss = new DetallePedidoBussines();
	private MaquinariaBussines maqBuss = new MaquinariaBussines();
	private ProductosExistenciaBussines prodBuss = new ProductosExistenciaBussines();
	private CatalogoProductoBussines catProdBuss = new CatalogoProductoBussines();
	private MateriaPrimaExistenciasBussines matPrimaBuss = new MateriaPrimaExistenciasBussines();
	private HistEstatusDetallePedidoBussines histEstPedBuss = new HistEstatusDetallePedidoBussines();
	private ClientesBussines clienteBuss = new ClientesBussines();
	private DateUtil fDate = new DateUtil();
	private String res=null;
	
	public String AgregarOrdenProduccion(Date fecha, Boolean procede, Long idDetallePedido, String estatus, ArrayCollection Productos , ArrayCollection IdsReem, int cantidad){
	
		OrdenDeProduccionEntity ordProdE = new OrdenDeProduccionEntity();
		ordProdE.setFecha(fecha);
		ordProdE.setProcede(procede);
		ordProdE.setIdDetallePedido(idDetallePedido);
		ordProdE.setEstatus(estatus);
		System.out.println("llega"); 
		DetallePedidoEntity detE = detPedidoBuss.getDetallePedidoId(idDetallePedido);
		System.out.println("Id Prod Pedido " + detE.getIdProducto());
		System.out.println( "id prod"+detE.getIdProducto());
		System.out.println( "id prod"+detE.getIdProducto());
		String flag="n";
		if(detE.getIdProducto()!=null){
		List<CatalogoProductoEntity> lstCatProd = catProdBuss.getCatalogoPPorIdProducto(detE.getIdProducto());
		for(CatalogoProductoEntity catProdE:lstCatProd){
			System.out.println("Prods" );
			if(catProdE.getIdMateria()!=0 && catProdE.getIdMateria()!= null ){
				MateriaPrimaExistenciasEntity matPrimaE = matPrimaBuss.getMateriaPrimaExistenciasId(catProdE.getIdMateria());
				if (cantidad<=0){
					if(matPrimaE.getCantidad()>=detE.getCantidad() * catProdE.getCantidad()){
						flag="s";
						detE.setExcepcionfaltanes(false);
						detPedidoBuss.modificarDetallePedido(idDetallePedido, detE.getCantidad(), detE.getIdPedido(), detE.getIdProducto(), detE.getReflector(), detE.getLogotipo(), detE.getSerigrafia(), detE.getIdMateria(), detE.getEstatus(), detE.getExcepcionfaltanes());
					}
					else{
						flag="n";
						float f=detE.getCantidad() * catProdE.getCantidad()-matPrimaE.getCantidad();
						res=matPrimaE.getNombre() + "," + f +  detE.getCantidad() + "," + detE.getIdMateria();
						System.out.println(res);
						detE.setExcepcionfaltanes(true);
						detPedidoBuss.modificarDetallePedido(idDetallePedido, detE.getCantidad(), detE.getIdPedido(), detE.getIdProducto(), detE.getReflector(), detE.getLogotipo(), detE.getSerigrafia(), detE.getIdMateria(), detE.getEstatus(), detE.getExcepcionfaltanes());
						return res;
					}
				}
				else{
					if(matPrimaE.getCantidad()>=cantidad * catProdE.getCantidad()){
						flag="s";
						detE.setExcepcionfaltanes(false);
						detPedidoBuss.modificarDetallePedido(idDetallePedido, detE.getCantidad(), detE.getIdPedido(), detE.getIdProducto(), detE.getReflector(), detE.getLogotipo(), detE.getSerigrafia(), detE.getIdMateria(), detE.getEstatus(), detE.getExcepcionfaltanes());
					}
					else{
						flag="n";
						float f=cantidad * catProdE.getCantidad()-matPrimaE.getCantidad();
						res=matPrimaE.getNombre() + "," + f +  detE.getCantidad() + "," + detE.getIdMateria();
						System.out.println(res);
						detE.setExcepcionfaltanes(true);
						detPedidoBuss.modificarDetallePedido(idDetallePedido, detE.getCantidad(), detE.getIdPedido(), detE.getIdProducto(), detE.getReflector(), detE.getLogotipo(), detE.getSerigrafia(), detE.getIdMateria(), detE.getEstatus(), detE.getExcepcionfaltanes());
						return res;
					}
				}
			}
			if(catProdE.getIdRefaccion()!=0 && catProdE.getIdRefaccion()!= null){
				ProductosExistenciasEntity prodsE = prodBuss.getProductoExistenciaPorId(catProdE.getIdRefaccion());
				if(cantidad<=0)
				{
					if(prodsE.getCantidad()>=detE.getCantidad() * catProdE.getCantidad()){
						flag="s";
						detE.setExcepcionfaltanes(false);
						detPedidoBuss.modificarDetallePedido(idDetallePedido, detE.getCantidad(), detE.getIdPedido(), detE.getIdProducto(), detE.getReflector(), detE.getLogotipo(), detE.getSerigrafia(), detE.getIdMateria(), detE.getEstatus(), detE.getExcepcionfaltanes());
						prodBuss.ModificarProductoExistenciaDirecto(prodsE);
					}	
					else{
						flag="n";
						float f=detE.getCantidad() * catProdE.getCantidad()-prodsE.getCantidad();
						res=prodsE.getNombre()+ "," + f +  detE.getCantidad() + "," + detE.getIdMateria();
						System.out.println(res);
						detE.setExcepcionfaltanes(true);
						detPedidoBuss.modificarDetallePedido(idDetallePedido, detE.getCantidad(), detE.getIdPedido(), detE.getIdProducto(), detE.getReflector(), detE.getLogotipo(), detE.getSerigrafia(), detE.getIdMateria(), detE.getEstatus(), detE.getExcepcionfaltanes());
						//prodBuss.ModificarProductoExistenciaDirecto(prodsE);
						return res;
					}		
				}
				else{

					prodsE = prodBuss.getProductoExistenciaPorId(catProdE.getIdRefaccion());
					
					if(prodsE.getCantidad()>=catProdE.getCantidad() * cantidad){
						flag="s";
						detE.setExcepcionfaltanes(false);
						detPedidoBuss.modificarDetallePedido(idDetallePedido, detE.getCantidad(), detE.getIdPedido(), detE.getIdProducto(), detE.getReflector(), detE.getLogotipo(), detE.getSerigrafia(), detE.getIdMateria(), detE.getEstatus(), detE.getExcepcionfaltanes());
						prodBuss.ModificarProductoExistenciaDirecto(prodsE);
					}
					else{
						flag="n";
						float f=detE.getCantidad() * cantidad-prodsE.getCantidad();
						res=prodsE.getNombre()+ "," + f +  detE.getCantidad() + "," + detE.getIdMateria();
						System.out.println(res);
						detE.setExcepcionfaltanes(true);
						detPedidoBuss.modificarDetallePedido(idDetallePedido, detE.getCantidad(), detE.getIdPedido(), detE.getIdProducto(), detE.getReflector(), detE.getLogotipo(), detE.getSerigrafia(), detE.getIdMateria(), detE.getEstatus(), detE.getExcepcionfaltanes());
						//prodBuss.ModificarProductoExistenciaDirecto(prodsE);
						
						return res;
					}
				}
			}
		}
		for(CatalogoProductoEntity catProdEc:lstCatProd){
			if (flag=="s" && detE.getExcepcionfaltanes()==false){
				if(catProdEc.getIdMateria()!=0 && catProdEc.getIdMateria()!= null ){
					MateriaPrimaExistenciasEntity matPrimaE = matPrimaBuss.getMateriaPrimaExistenciasId(catProdEc.getIdMateria());
					if(cantidad>0){
						Float cant = matPrimaE.getCantidad() - (detE.getCantidad() * catProdEc.getCantidad());
						matPrimaE.setCantidad(Float.valueOf(String.valueOf(cant)));
						matPrimaBuss.modificarMateriaPrimaExistenciasDirecto(matPrimaE);
						System.out.println("MAteria Prima");
					}	
					else{						
						Float cant = matPrimaE.getCantidad() - (detE.getCantidad() * catProdEc.getCantidad());
						matPrimaE.setCantidad(Float.valueOf(String.valueOf(cant)));
						matPrimaBuss.modificarMateriaPrimaExistenciasDirecto(matPrimaE);
						System.out.println("MAteria Prima");
					}
				}
				if(catProdEc.getIdRefaccion()!=0 && catProdEc.getIdRefaccion()!= null){
				ProductosExistenciasEntity prodsE = prodBuss.getProductoExistenciaPorId(catProdEc.getIdRefaccion());
					if(cantidad>0){
						Float cant = prodsE.getCantidad() - (detE.getCantidad() * catProdEc.getCantidad());
						prodsE.setCantidad(cant);
						System.out.println("cantidad");
						prodBuss.ModificarProductoExistenciaDirecto(prodsE);
						System.out.println("Refacciones");
					}
					else{
						Float cant = prodsE.getCantidad() - (detE.getCantidad() * catProdEc.getCantidad());
						prodsE.setCantidad(cant);
						System.out.println("cantidad");
						prodBuss.ModificarProductoExistenciaDirecto(prodsE);
						System.out.println("Refacciones");
					}
				}
			}
		}
		
		}else{
			MateriaPrimaExistenciasEntity matPrimaE = matPrimaBuss.getMateriaPrimaExistenciasId(detE.getIdMateria());
				
				if(matPrimaE.getCantidad() >= detE.getCantidad()){
					Float cant = matPrimaE.getCantidad() - (detE.getCantidad());
					matPrimaE.setCantidad(Float.valueOf(String.valueOf(cant)));
					matPrimaBuss.modificarMateriaPrimaExistenciasDirecto(matPrimaE);
					System.out.println("Materia Prima");
					detE.setExcepcionfaltanes(false);
					detPedidoBuss.modificarDetallePedido(idDetallePedido, detE.getCantidad(), detE.getIdPedido(), detE.getIdProducto(), detE.getReflector(), detE.getLogotipo(), detE.getSerigrafia(), detE.getIdMateria(), detE.getEstatus(), detE.getExcepcionfaltanes());
				}
				else{
					flag="n";
					detE.setExcepcionfaltanes(true);
					detPedidoBuss.modificarDetallePedido(idDetallePedido, detE.getCantidad(), detE.getIdPedido(), detE.getIdProducto(), detE.getReflector(), detE.getLogotipo(), detE.getSerigrafia(), detE.getIdMateria(), detE.getEstatus(), detE.getExcepcionfaltanes());
					float f=detE.getCantidad()-matPrimaE.getCantidad();
					res=matPrimaE.getNombre()+ "," + f +","+ matPrimaE.getCantidad() + "," + detE.getIdMateria();
					System.out.println(res);
					return res;					
  			}
				//MateriaPrimaExistenciasEntity matPrimaE = matPrimaBuss.getMateriaPrimaExistenciasId(detE.getIdMateria());
			

		}

		/**/
		if (flag=="s"&& detE.getExcepcionfaltanes()==false){
			res = ordProdDAO.agregarOrdenDeProduccio(ordProdE);
			detPedidoBuss.enviarAProduccion(idDetallePedido, cantidad, null, "SISTEMA");
			System.out.println("agregaORD" + res);
		}
		
			return res;
		
	}
	
	public String ModificarOrdenProduccion(Long idOrdenProd, Date fecha, Boolean procede, Long idDetallePedido, Long idMaquinaria,
			String estatus){
		OrdenDeProduccionEntity ordProdE = new OrdenDeProduccionEntity();
		
		ordProdE.setIdOrdenProd(idOrdenProd);
		ordProdE.setFecha(fecha);
		ordProdE.setProcede(procede);
		ordProdE.setIdDetallePedido(idDetallePedido);
		ordProdE.setIdMaquinaria(idMaquinaria);
		ordProdE.setEstatus(estatus);
		
		ordProdDAO.modificarOrdenDeProduccio(ordProdE);
		
		return res;
	}
	
	public String AlgoOrdenProduccion(Long idOrdenProd, String estatus, Long idMaquinaria, String encargado,Long IdPedido,Integer cantidad){
		
		ordProdDAO.directoOrdenDeProduccio(idOrdenProd, estatus, idMaquinaria, encargado);
		//detPedidoBuss.enviarAProduccion(IdPedido, cantidad,idMaquinaria , encargado);
		histEstPedBuss.agregarEstatusDetPed(IdPedido, cantidad, "EN PROCESO", idMaquinaria, encargado);
		
		return res;
	}
	
	public String EliminarOrdenProduccion(Integer idOrdenDeProduccio){
		
		ordProdDAO.eliminarOrdenDeProduccio(idOrdenDeProduccio);
		
		return res;
	}
	
	public List<OrdenDeProduccionEntity> getTodasOrdenesDeProduccion(){
		List<OrdenDeProduccionEntity> lstOrdenes = ordProdDAO.getTodoOrdenesDeProduccio();
		
		for(OrdenDeProduccionEntity ordProdE:lstOrdenes){
			if(ordProdE.getIdDetallePedido()!=0){
				ordProdE.setClaveMaq(maqBuss.getMaquinariaId(ordProdE.getIdMaquinaria()).getClave());
				ordProdE.setNombreProducto(detPedidoBuss.getDetallePedidoId(ordProdE.getIdDetallePedido()).getNombreProducto());
			}
			
		}
		
		return lstOrdenes;
	}
	
	public OrdenDeProduccionEntity getOrdenDeProduccionPorId(Integer idOrdenDeProduccio){
		System.out.println("llega");
		OrdenDeProduccionEntity orden = ordProdDAO.getOrdenDeProduccioId(idOrdenDeProduccio);
		
		if(orden != null){
			if(orden.getIdMaquinaria()!=null){
				orden.setClaveMaq(maqBuss.getMaquinariaId(orden.getIdMaquinaria()).getClave());
			}
			orden.setNombreProducto(prodBuss.getProductoExistenciaPorId(detPedidoBuss.getDetallePedidoId(orden.getIdDetallePedido()).getIdProducto()).getNombre());
			orden.setCantidad(detPedidoBuss.getDetallePedidoId(orden.getIdDetallePedido()).getCantidad());
			orden.setSFecha(fDate.getDateToString(orden.getFecha()));
			System.out.println(orden.getSFecha());
		}
		
		return orden;
	}
	public OrdenDeProduccionEntity getOrdenDeProduccionPorIdPedido(long idPedido){
		OrdenDeProduccionEntity orden = ordProdDAO.getOrdenDePPoridPedido(idPedido);		
		return orden;
	}
	public Long getIdOrdenDeProduccionPorIdPedido(long idPedido){
		Long orden = ordProdDAO.getIdOrdenDePPoridPedido(idPedido);		
		return orden;
	}
	public String getTipoPorIdPedido(long idPedido){
		OrdenDeProduccionEntity orden = ordProdDAO.getOrdenDePPoridPedido(idPedido);	
		DetallePedidoEntity detE = detPedidoBuss.getDetallePedidoId(idPedido);
		PedidosEntity pedido = pedidoDAO.getPedidosId(detE.getIdPedido());
		orden.setTipo(pedido.getTipo());
		System.out.println("Tipo: " + orden.getTipo());
		return orden.getTipo();
	}
	public String getClavePorIdPedido(long idPedido){
		OrdenDeProduccionEntity orden = ordProdDAO.getOrdenDePPoridPedido(idPedido);	
		orden.setClaveProd(prodBuss.getProductoExistenciaPorId(detPedidoBuss.getDetallePedidoId(orden.getIdDetallePedido()).getIdProducto()).getClave());
		return orden.getClaveProd();
	}
	public String getFechaPorIdPedido(long idPedido){
		OrdenDeProduccionEntity orden = ordProdDAO.getOrdenDePPoridPedido(idPedido);
		DetallePedidoEntity detE = detPedidoBuss.getDetallePedidoId(idPedido);
		PedidosEntity pedido = pedidoDAO.getPedidosId(detE.getIdPedido());
		orden.setSFecha(pedido.getSFecha());
		return orden.getSFecha();
	}
	public String getClientePorIdPedido(long idPedido){
		OrdenDeProduccionEntity orden = ordProdDAO.getOrdenDePPoridPedido(idPedido);
		DetallePedidoEntity detE = detPedidoBuss.getDetallePedidoId(idPedido);
		PedidosEntity pedido = pedidoDAO.getPedidosId(detE.getIdPedido());
		ClientesEntity cliente = clienteBuss.getClientesId(pedido.getIdCliente());
		orden.setNombreCliente(cliente.getNombre());
		return orden.getNombreCliente();
	}
}
